WPF如何实现在控件上显示Loading等待动画 您所在的位置:网站首页 wpf loading控件 WPF如何实现在控件上显示Loading等待动画

WPF如何实现在控件上显示Loading等待动画

2023-03-28 20:57| 来源: 网络整理| 查看: 265

WPF如何实现在控件上显示Loading等待动画 发布时间:2023-03-25 15:54:15 来源:亿速云 阅读:72 作者:iii 栏目:开发技术

这篇文章主要介绍了WPF如何实现在控件上显示Loading等待动画的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇WPF如何实现在控件上显示Loading等待动画文章都会有所收获,下面我们一起来看看吧。

WPF 如何在控件上显示 Loading 等待动画

框架使用.NET40;

Visual Studio 2022;

使用方式需引入命名空间后设置控件的附加属性 wd:Loading.IsShow="true",即可显示默认等待动画效果如下:

WPF如何实现在控件上显示Loading等待动画

如需自定义 Loading 一定要 先设置 wd:Loading.Child 在设置 IsShow="true" 。

显示不同 Loading 内容需 wd:Loading.Child ={x:Static wd:NormalLoading.Default} 进行复赋值显示 NormalLoading 效果如下:

Github[2]

Github xaml[3]

Gitee[4]

Gitee xaml[5]

WPF如何实现在控件上显示Loading等待动画

实现代码

也可以自定义 Loading 动画如下:

1、自定义控件 CustomLoading 。

public class CustomLoading : Control     {         public static CustomLoading Default = new CustomLoading();         static CustomLoading()         {             DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomLoading),                 new FrameworkPropertyMetadata(typeof(CustomLoading)));         }     }

2、编写 CustomLoading.xaml 代码如下。

                                                                                                                        

1)创建装饰 AdornerContainer 代码如下:

using System.Windows; using System.Windows.Documents; using System.Windows.Media; namespace WPFDevelopers.Utilities {     public class AdornerContainer : Adorner     {         private UIElement _child;         public AdornerContainer(UIElement adornedElement) : base(adornedElement)         {         }         public UIElement Child         {             get => _child;             set             {                 if (value == null)                 {                     RemoveVisualChild(_child);                     _child = value;                     return;                 }                 AddVisualChild(value);                 _child = value;             }         }         protected override int VisualChildrenCount         {             get             {                 return _child != null ? 1 : 0;             }         }         protected override Size ArrangeOverride(Size finalSize)         {             _child?.Arrange(new Rect(finalSize));             return finalSize;         }         protected override Visual GetVisualChild(int index)         {             if (index == 0 && _child != null) return _child;             return base.GetVisualChild(index);         }     } }

2)创建蒙板控件 MaskControl 代码如下:

using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace WPFDevelopers.Controls {     public class MaskControl : ContentControl     {         private readonly Visual visual;         public static readonly DependencyProperty CornerRadiusProperty =           DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(MaskControl),                new PropertyMetadata(new CornerRadius(0)));         public MaskControl(Visual _visual)         {             visual = _visual;         }         public CornerRadius CornerRadius         {             get => (CornerRadius)GetValue(CornerRadiusProperty);             set => SetValue(CornerRadiusProperty, value);         }     } }

3)创建 Loading 继承 BaseControl 增加附加属性 IsShow 代码如下:

True 则动态添加装饰器 AdornerContainer 并将 MaskControl 添加到 AdornerContainer.Child 中。

False 则移除装饰器。

using System.Runtime.CompilerServices; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Markup; using System.Windows.Media; using WPFDevelopers.Helpers; using WPFDevelopers.Utilities; namespace WPFDevelopers.Controls {     public class Loading : BaseControl     {         public static readonly DependencyProperty IsShowProperty =            DependencyProperty.RegisterAttached("IsShow", typeof(bool), typeof(Loading),                new PropertyMetadata(false, OnIsLoadingChanged));         private const short SIZE = 25;         private const double MINSIZE = 40;         private static FrameworkElement oldFrameworkElement;         private static void OnIsLoadingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)         {             if (e.NewValue is bool isMask && d is FrameworkElement parent)             {                 if (isMask)                 {                     if (!parent.IsLoaded)                         parent.Loaded += Parent_Loaded;                     else                         CreateMask(parent);                 }                 else                 {                     parent.Loaded -= Parent_Loaded;                     CreateMask(parent, true);                 }             }         }         private static void Parent_Loaded(object sender, RoutedEventArgs e)         {             if (sender is UIElement element)                 CreateMask(element);         }         static void CreateMask(UIElement uIElement, bool isRemove = false)         {             var layer = AdornerLayer.GetAdornerLayer(uIElement);             if (layer == null) return;             if (isRemove && uIElement != null)             {                 var adorners = layer.GetAdorners(uIElement);                 if (adorners != null)                 {                     foreach (var item in adorners)                     {                         if (item is AdornerContainer container)                         {                             var isAddChild = (bool)Loading.GetIsAddChild(uIElement);                             if (!isAddChild)                                 Loading.SetChild(uIElement, null);                             container.Child = null;                             layer.Remove(container);                         }                     }                 }                 return;             }             var adornerContainer = new AdornerContainer(uIElement);             var value = Loading.GetChild(uIElement);             if (value == null)             {                 var isLoading = GetIsShow(uIElement);                 if (isLoading)                 {                     var w = (double)uIElement.GetValue(ActualWidthProperty);                     var h = (double)uIElement.GetValue(ActualHeightProperty);                     var defaultLoading = new DefaultLoading();                     if (w 


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有